/**
 * @file 	 xp_lpuart.h
 * @brief    当前驱动提供对指定的 LPUARTn 配置为通过 DMA + RingBuffer 发送和接收
 * @author 	 wenbo
 * @version  1.0
 * @date 	 2023-03-21
 * 
 * @copyright Copyright (c) 2023  YGL
 * 
 */

#ifndef _XP_LPUART_H
#define _XP_LPUART_H

#include "bsp.h"

typedef void (*recv_irq_callback_t)(void);

/** 使用说明：
 * 用户层首先调用 Init_LPUART() 接口进行配置(缓冲区大小需在 xp_lpuart.c 中静态指定),
 * 然后如果有需要,可通过 register_recv_irq_callback() 注册接收回调(基于空闲中断接收到一帧数据)
 * 最后可通过轮询/信号量方式通过 pop_from_rx_ringbuffer() 接口从接收环形缓存获取最新数据,
 * 通过 push_to_tx_ringbuffer() 接口将待发送数据拷贝至发送环形缓存,并通过 flush_tx_ringbuffer()
 * 接口将环形缓存中数据通过 DMA 发送出去(目前调用一次仅处理发送一帧数据,建议轮询,非阻塞)
 */


/**
 * @brief       初始化 LPUARTx 通过 eDMA 发送和接收数据(端口号错误将 assert)
 * @param[in]	port                端口编号(1~n: LPUART1~LPUARTn)
 * @param[in]	baudRate            波特率          
 * @param[in]	parity              校验(0: none, 1: odd, 1: even)
 */
void Init_LPUART(uint8_t port, uint32_t baudRate, uint8_t parity);
/**
 * @brief       
 * @param[in]	port                
 */
void Deinit_LPUART(uint8_t port);
/**             LPUART接收使能
 * @brief       
 * @param[in]	port                
 * @param[in]	enable              
 */
void LPUART_recv_enable(uint8_t port, bool enable);
/**
 * @brief       注册中断接收回调
 * @param[in]	port                端口编号
 * @param[in]	cb                  回调函数指针
 */
void register_recv_irq_callback(uint8_t port, recv_irq_callback_t cb);
/**
 * @brief       push 待发送的数据到发送环形缓冲
 * @param[in]	port                端口编号
 * @param[in]	pData               待发送数据指针(接口内拷贝至缓冲)
 * @param[in]	size                发送数据数量(byte)
 * @return      bool                false: 参数不正确
 */
bool push_to_tx_ringbuffer(uint8_t port, uint8_t const* pData, uint16_t size);
/**
 * @brief       从接收环形缓冲区 pop 数据
 * @param[in]	port                端口编号
 * @param[in]	pData               指向缓冲区的目标数据指针
 * @param[in]	size                缓冲区目标数据数量
 * @return      bool                false: 当前缓冲区没有新数据或者参数错误
 */
bool pop_from_rx_ringbuffer(uint8_t port, uint8_t** pData, uint16_t* size);
/**
 * @brief       如果发送缓冲区中有新数据则通过 DMA 发送出去
 * @param[in]	port                端口编号
 * @return      bool                false: 没有数据要发送或者发送忙
 */
bool flush_tx_ringbuffer(uint8_t port);

/**
 * @brief       LPUART 驱动测试程序(阻塞将接收到的数据回环发送出去)
 * @return      int                 ...
 */
int LPUART_test(void);

#endif
